/**
 *
 */
package jdk8日期;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

import org.junit.Test;

/**
 * java 8日期 of：静态工厂方法。
 *
 * parse：静态工厂方法，关注于解析。
 *
 * get：获取某些东西的值。
 *
 * is：检查某些东西的是否是true。
 *
 * with：不可变的setter等价物。
 *
 * plus：加一些量到某个对象。
 *
 * minus：从某个对象减去一些量。
 *
 * to：转换到另一个类型。
 *
 * at：把这个对象与另一个对象组合起来，例如： date.atTime(time)。
 *
 * @Title:
 * @author zhoujie
 * @date 2018年7月27日 上午9:37:05
 *
 */
public class LocalTimeDome {
    @Test
    public void test01() {
        LocalDate ld = LocalDate.now();// 年月日
        LocalDateTime llt = LocalDateTime.now();// 年月日时分秒
        LocalTime lt = LocalTime.now();// 时分秒
        // 明天
        System.out.println("明天：" + LocalTimeUtil.formatTime(ld.plusDays(1), "yyyy-MM-dd"));
        // 昨天
        System.out.println("昨天：" + LocalTimeUtil.formatTime(ld.minusDays(1), "yyyy-MM-dd"));

    }

    @Test
    public void test02() {
        // 月份没有从0开始
        LocalDateTime llt = LocalDateTime.of(2018, 7, 27, 0, 0);
        System.out.println(LocalTimeUtil.formatTime(llt, "yyyy-MM-dd HH:mm:ss.SSS"));

        LocalDate llt1 = LocalDate.parse("2018-07-27");// 根据字符串生成对象
        System.out.println(LocalTimeUtil.formatTime(llt1, "yyyy-MM-dd"));

    }

    @Test
    public void test03() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 预定定义转换
        LocalDate localDate = LocalDate.parse("2017-07-17", dateTimeFormatter);

        LocalDate localDate2 = LocalDate.parse("2017-07-18", dateTimeFormatter);
        System.out.println(LocalTimeUtil.formatTime(localDate, "yyyy-MM-dd"));
        System.out.println(LocalTimeUtil.formatTime(localDate2, "yyyy-MM-dd"));

        // localDate.from(dateTimeFormatter);

    }

    @Test
    public void test04() {
        LocalDate today = LocalDate.now();
        // 取本月第1天：
        LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
        System.out.println(LocalTimeUtil.formatTime(firstDayOfThisMonth, "yyyy-MM-dd"));
        // 取本月第2天：
        LocalDate secondDayOfThisMonth = today.withDayOfMonth(2);
        // 取本月最后一天，再也不用计算是28，29，30还是31：
        LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
        // 取下一天：
        LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1);
        // 取2015年1月第一个周一，这个计算用Calendar要死掉很多脑细胞：
        LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01")
                .with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05

    }
}
